#pragma once 
#include "common.hpp"
#include "log.hpp"
#include "InetAddr.hpp"
#include "Thread_Pool.hpp"
#include "Socket.hpp"
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
#include <pthread.h>
#include <functional>
#include <iostream>
#include <unistd.h>
#include <memory>

using namespace InetAddrModule;
using namespace SocketModule;

using ioservice_t = std::function<void(std::shared_ptr<Socket> &sock, InetAddr&)>;
using task_t = std::function<void()>;
// using func_t = std::function<std::string(const std::string& , InetAddrModule::InetAddr&)>;

const int default_listensockfd = -1;
// listen函数的允许的底层排队的链接最大数量。
const static int backlog = 5;

class TcpServe
{
public:
    TcpServe(uint16_t port,ioservice_t service)
        :_port(port)
        ,_listensockptr(std::make_unique<TcpSocket>())
        ,_isrunning(false)
        ,_service(service)
    {
        _listensockptr->BuildTcpSocketMethod(_port);
    }
    ~TcpServe()
    {
        ;
    }void Start()
    {
        _isrunning = true;
        while(_isrunning)
        {
            InetAddr client;
            auto sock = _listensockptr->Accept(&client);// 1.和client通信sockfd。 2.  client 网络地址。
            if(sock == nullptr)
            {
                continue;
            }
            LogSpace::LOG(LogSpace::LogLevel::DEBUG) << "accept success" << client.Name();
            
            pid_t id = fork();
            if(id < 0)
            {
                LogSpace::LOG(LogSpace::LogLevel::FATAL) << "Fork Error" << client.Name();
                exit(FORK_ERROR);
            }
            else if(id == 0)
            {
                // 子进程 -> listensock
                // 因为不想让子进程
                _listensockptr->Close();
                // 让子进程退出，孙子进程进行。
                // 这样就不用父进程去回收子进程。
                if(fork() > 0)
                    exit(OK);

                // 孙子进程在执行任务时，已经成为孤儿进程。
                _service(sock,client);
                sock->Close();
                exit(OK);
            }
            else
            {
                // 父进程 -> sock
                sock->Close();
                pid_t rid = ::waitpid(id,nullptr,0);
                (void) rid;
            }
        }
        _isrunning = false;
    }
private:
    uint16_t _port;
    std::unique_ptr<Socket> _listensockptr;
    //int _listensockfd; // 监听socket
    bool _isrunning;

    ioservice_t _service; // 设置回调处理
};
